14153
21334
Saniyede aşağıdaki gibi bir zaman listem var:
L = [0.10218048, 1.20851996, 1.46800021, 1.73429061, 2.71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
İkinci bir sınırdan başlayan 2 saniyelik her bir pencere için, 2 saniyelik pencereye düşen tüm zamanların bir listesini çıkarmak istiyorum. Yani yukarıdaki örnek için şöyle olur:
[0.10218048, 1.20851996, 1.46800021, 1.73429061]
[1.20851996, 1.46800021, 1.73429061, 2.71525848]
[2.71525848, 3.14781922, 3.63637958]
[3.14781922, 3.63637958]
[5.11147358, 5.97497864]
[5.11147358, 5.97497864, 6.35469013, 6.80623747, 6.99571917]
[6.35469013, 6.80623747, 6.99571917, 7.65215123, 7.86108352]
[7.65215123, 7.86108352, 8.52988247, 8.83068894]
[8.52988247, 8.83068894]
[10.07690977]
[10.07690977, 11.5386728]
[11.5386728, 12.01214112, 12.13307653]
[12.01214112, 12.13307653]
Genel olarak pencere uzunluğu 2'den farklı olabilir.
Bunu nasıl yaparsın? 
Sanırım "İkinci bir sınırda başlayan 2 saniyelik her bir pencere için" ve çakışmayan bir artışı kastettiniz. İki saniyelik aralıklar için aynıdır, ancak uzunluğu değiştirmek istediğiniz için, bir saniyelik çakışma 0-3, 2-5, 4-7 olur, ancak artış 0-3, 1-4, 2- anlamına gelir. 5. Ancak, her ihtimale karşı her ikisi için de çözümler bulmak ilginçti.
L'nin sıralandığını ve tüm elemanların pozitif olduğunu ve ikinci aralıkların hepsinin tamsayılarla başladığını varsayarsak, bu yöntemi kullanabiliriz:
matematik ithal etmek
koleksiyonlardan defaultdict içe aktar
L = [0.10218048, 1.20851996, 1.46800021, 1.73429061, 2.71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
my_ranges = defaultdict (liste)
interval_width = 2
L cinsinden x için:
üst_bound = matematik.ceil (x)
lower_bound = üst_bound - interval_width
alt sınır = maksimum (0, alt sınır)
aralıktaki y için (alt sınır, üst sınır):
aralıklarım [y] .append (x)
sıralanmış bir için (aralıklarım):
baskı (aralıklarım [a])
Boş aralıklar olup olmadığını görmek isteyip istemediğinizi bilmiyorum. Ancak varsayılan dikte, isterseniz boş aralıkları da yazdırır. "Sıralanmış için" yerine bu satırı kullanın:
aralık içi (min (aralıklarım), maks (aralıklarım) + 1):
0-3, 2-5, 4-7 aralıklarını istiyorsanız, bu çalışır:
matematik ithal etmek
koleksiyonlardan defaultdict içe aktar
L = [0.10218048, 1.20851996, 1.46800021, 1.73429061, 2.71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653]
interval_width = 2
my_ranges_2 = defaultdict (liste)
L cinsinden x için:
kesinlikle_in = (x // (interval_width - 1)) * (interval_width - 1) # x'in altındaki interval_width'in en düşük katı her zaman içinde olacaktır
#print ("Ekleniyor", x, "kime", kesinlikle_in)
aralıklarım_2 [kesinlikle_in] .append (x)
eğer x  = 0: # örneğin, x 2,3 ise ve 0,3 2,5 vb. varsa ... Pencere uzunluklarının tamsayı olduğunu varsayıyorum ve değilse, daha yapacak çok işimiz var çünkü sayı birden fazla dizide olabilir. Belki de (interval_width - 1) oranında artan bir while döngüsüne sahip olabiliriz.
#print ("++ Ekleme", x, "kime", kesinlikle_in - aralık_ genişliği + 1)
aralıklarım_2 [kesinlikle_in - aralık_genişliği + 1] .append (x)
sıralı bir için (aralıklarım_2):
baskı (a, aralıklarım_2 [a])
# print (aralıklarım_2 [a])
Unuttuğum bazı ayrıntılar olduğundan şüpheleniyorum, ancak umarım, kodumun umduğunuz şeyi yaptığından emin olmak ve tam olarak neye ihtiyacınız olduğunu bana bildirmek için gerektiği kadar interval_width'i çevirebilirsiniz.
|
Önerebileceğim olası bir çözüm, girdi verileri üzerinden yalnızca bir kez yinelenen ve bağımlılıkları olmayan bir anlamda "verimli" dir. Elbette maliyeti, saf python ile yazılması (daha fazla optimize edilmiş kod olabilir) ve yinelemeyi önlemek için daha fazla izleme değişkeni sunması (ve dolayısıyla daha az pitonik olması).
def sliding_window (veriler, süre, başlangıç ​​= 0, örtüşme = 1):
sonuç = []
data_idx = 0
result_idx = 0
üst = başlangıç ​​+ süre
alt = başlangıç
next_lower = üst - örtüşme
# Boş iç listeleri ekleme noktasına kadar doldurmak ve eklemek için iç yardımcı
def pad_and_append (at):
len (sonuç) <= at:
result.append ([])
sonuç [at] .append (data [data_idx])
# giriş verilerini yineleyin
data_idx  a:
eğer x  = l [0]) & (L  = i) & (L